home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 February / Gamestar_81_2006-02_dvd.iso / Red Shark / Missions / Mission_11 / MissionTasks.script < prev    next >
Text File  |  2002-01-31  |  25KB  |  959 lines

  1. //-------------------------------------------------------------------
  2. //
  3. //  This code is copyright 2001 by G5 Software.
  4. //  Any unauthorized usage, either in part or in whole of this code
  5. //  is strictly prohibited. Violators WILL be prosecuted to the
  6. //  maximum extent allowed by law.
  7. //
  8. //-------------------------------------------------------------------
  9.  
  10. ///////////////////////////////////
  11. //
  12. // Mission 11 -- Draw Attention
  13. //
  14. ///////////////////////////////////
  15. class CMission11_AIController extends CBaseAIController
  16. {
  17.   array  ActivatePointCenterList = array(
  18.     vector( 4750, 6700, 0 ),     // Supply Tank Soviet Convoy
  19.     vector( 4015, 6760, 0 ),
  20.     vector( 2890, 5270, 0 ),     // Katusha FireLine
  21.     vector( 2249, 3464, 0 ),     // Soviet Strike Point of attack
  22.     vector( 3768, 6904, 0 ),     // Point of Nazi Cross placing
  23.     vector( 3330, 8060, 0 ),     // Point of Reserve attack
  24.     vector( 2273, 3790, 0 ),     // SovietStrike attacket GB10
  25.     vector( 3651, 7273, 0 )      // Activate Defender Patrol
  26.     );    //
  27.  
  28.  
  29.   array  ActivatePointRadiusList = array(
  30.     50.0,                       //
  31.     50.0,
  32.     50.0,
  33.     100.0,
  34.     150.0,
  35.     100.0,
  36.     100.0,
  37.     50.0);
  38.  
  39.   array  ActivatePointNameList = array(
  40.     "A",
  41.     "B",
  42.     "C",
  43.     "D",
  44.     "E",
  45.     "F",
  46.     "G",
  47.     "H");
  48.  
  49.   boolean OnKatuchaStartsFire  = false;
  50.   boolean OnKatuchaChangedFire = false;
  51.   boolean OnKatuchaStopsFire   = false;
  52.   boolean OnKatuchaStopsMoving = false;
  53.  
  54.   void OnObjectEnterArea( int _AreaIndex, string _NavPointName, string _ObjectID)
  55.   {
  56.     if ( _AreaIndex == 0
  57.       && Core_IsStringStartsWith( _ObjectID, "11_Soviet_Tank"))
  58.     {
  59.       Core_BroadcastEvent("OnConvoySTankStop");
  60.     }
  61.     if ( _AreaIndex == 1
  62.       && Core_IsStringStartsWith( _ObjectID, "11_Platoon"))
  63.     {
  64.       Core_BroadcastEvent("OnConvoySPlatoonStop");
  65.     }
  66.     if ( _AreaIndex == 2
  67.       && Core_IsStringStartsWith( _ObjectID, "11_Katusha"))
  68.     {
  69.       if ( !OnKatuchaStopsMoving )
  70.         {
  71.           OnKatuchaStopsMoving = true;
  72.           Core_BroadcastEvent("OnConvoyKatushaStop");
  73.         }
  74.     }
  75.     if ( _AreaIndex == 3
  76.       && Core_IsStringStartsWith( _ObjectID, "11_Soviet_Strike"))
  77.     {
  78.       Core_BroadcastEvent("OnSovietSrikeStop");
  79.     }
  80.     if ( _AreaIndex == 4
  81.       && Core_IsStringStartsWith( _ObjectID, "11_Soviet_Strike"))
  82.     {
  83.       if ( !OnKatuchaStartsFire )
  84.         {
  85.           OnKatuchaStartsFire = true;
  86.           Core_BroadcastEvent("OnKatushaStartFire");
  87.         }
  88.     }
  89.     if ( _AreaIndex == 6
  90.       && Core_IsStringStartsWith( _ObjectID, "11_Soviet_Strike"))
  91.     {
  92.       Core_BroadcastEvent("OnKatushaStopFire");
  93.     }
  94.     if ( _AreaIndex == 7
  95.       && Core_IsStringStartsWith( _ObjectID, "11_Soviet_Strike"))
  96.     {
  97.       Core_BroadcastEvent("OnDefenderStarts");
  98.     }
  99.     if ( Core_IsStringStartsWith( _NavPointName, "NavPoint_Change")
  100.          && Core_IsStringStartsWith( _ObjectID, "11_Soviet_Strike"))
  101.       {
  102.         if ( !OnKatuchaChangedFire )
  103.           {
  104.             OnKatuchaChangedFire = true;
  105.             Core_BroadcastEvent("Katusha_ChangeFire");
  106.           }
  107.       }
  108.     if ( Core_IsStringStartsWith( _NavPointName, "NavPoint_Stop")
  109.          && Core_IsStringStartsWith( _ObjectID, "11_Soviet_Strike"))
  110.       {
  111.         if ( !OnKatuchaStopsFire )
  112.           {
  113.             OnKatuchaStopsFire = true;
  114.             Core_BroadcastEvent("Katusha_StopFire");
  115.           }
  116.       }
  117.     if ( _AreaIndex == 5
  118.       && Core_IsStringStartsWith( _ObjectID, "11_Katusha"))
  119.     {
  120.       Core_BroadcastEvent("OnNaziReserveStart");
  121.     }
  122.     if ( _AreaIndex == 4
  123.       && Core_IsStringStartsWith( _ObjectID, "11_Nazi_Reserve"))
  124.     {
  125.       Core_BroadcastEvent("OnNaziReserveAttack");
  126.     }
  127.   }
  128. }
  129. //===============================================================================
  130. class C11_NaziGB10_Tank extends CBaseAITask_BaseTask
  131. {
  132.   float  DisperceRadius = 50;
  133.   float  OvertakeSpeed  = 25;
  134.   void OnEnemyTargeted()
  135.     {
  136.     string EnemyID = GetTargetedEnemy();
  137.     SetFireStyle_Enemy( EnemyID);
  138.     GiveOrder_Disperse();
  139.     }
  140.   void GiveOrder_Disperse()
  141.     {
  142.     // set state
  143.     SetOrder_StopNow();
  144.         SetOrder_MoveTo(
  145.             GetNowPosition() + vector( rand(DisperceRadius), rand(DisperceRadius), 0.0),
  146.             OvertakeSpeed);
  147.     }
  148. }
  149. //-----------------------------------------------------------------------------------
  150. class C11_GB10_Defend extends C11_Soviet_Tank
  151. {
  152.  
  153.   float OvertakeSpeed = 30;
  154.  
  155.   void OnDefenderStarts()
  156.   {
  157.     DestinationPoint = GetNavPoint("NavPoint_04");
  158.     GiveOrder_MoveToTarget();
  159.   }
  160.   void OnConvoySTankStop()
  161.   {
  162.     ClearState();
  163.   }
  164.  
  165.   void Init()
  166.   {
  167.     DestinationPoint = GetNavPoint("NavPoint_04");
  168.     // give start order
  169.     // GiveOrder_MoveToTarget();
  170.   }
  171.  
  172.   void OnEnemyTargeted()
  173.   {
  174.     string EnemyID = GetTargetedEnemy();
  175.     SetFireStyle_Enemy( EnemyID);
  176.     GiveOrder_Disperse();
  177.   }
  178.   void GiveOrder_MoveToTarget()
  179.   {
  180.     //Core_LogMessage("" + Core_GetIdentificator() + ": order: move to target");
  181.  
  182.     string Leader = GetCommander("GB10Defend_Rank"); // find leader that we should followed by
  183.     if ( Moving == true
  184.       && Leader == CurLeader)
  185.     {
  186.       // nothing changed
  187.       return;
  188.     }
  189.  
  190.     // set state
  191.     ClearState();
  192.     Moving = true;
  193.     CurLeader = Leader;
  194.  
  195.     if ( Leader == "")
  196.     {
  197.       // we are leader. go directly to destination
  198.       SetOrder_MoveTo(
  199.         DestinationPoint,
  200.         CruiserSpeed);
  201.     }
  202.     else
  203.     {
  204.       // leader found. follow him
  205.       SetOrder_Follow(
  206.         Leader, // follow leader
  207.         AutocadDistanceMin,
  208.         AutocadDistanceOptimum,
  209.         AutocadDistanceOvertake,
  210.         CruiserSpeed,
  211.         OvertakeSpeed);
  212.     }
  213.   }
  214.  
  215. }
  216. ///-----------------------------------------------------------------------
  217. class C11_NaziGB9_Tank extends C11_NaziGB10_Tank
  218. {
  219.   void Unit_Destroyed( string ObjectID )
  220.   {
  221.     if ( Core_IsStringStartsWith( ObjectID, "11_Nazi_GB9_" ))
  222.     {
  223.       Core_BroadcastEvent( "Base09UnderAttack" );
  224.     }
  225.   }
  226. }
  227. //===========================================================================
  228. class C11_Cross extends CNavPointUser, CBaseAITask_BaseTask
  229. {
  230.   boolean Attacked        = false;
  231.   float   DisperceRadius  = 50;
  232.   float OvertakeSpeed     = 30;
  233.   void OnEnemyTargeted()
  234.   {
  235.     string EnemyID = GetTargetedEnemy();
  236.     SetFireStyle_Enemy( EnemyID);
  237.     GiveOrder_Disperse();
  238.   }
  239.  
  240.   void GiveOrder_Disperse()
  241.   {
  242.     // set state
  243.     SetOrder_StopNow();
  244.  
  245.         // move to random point
  246.         SetOrder_MoveTo(
  247.             GetNowPosition() + vector( rand(DisperceRadius), rand(DisperceRadius), 0.0),
  248.             OvertakeSpeed);
  249.   }
  250.  
  251.   void OnNoEnemy()
  252.   {
  253.     SetOrder_StopNow();
  254.   }
  255.  
  256.   void Unit_Destroyed( string ObjectID )
  257.   {
  258.     if ( (Core_IsStringStartsWith( ObjectID, "11_Cross" )) && (!Attacked) )
  259.     {
  260.       string EnemyID = GetTargetedEnemy();
  261.       SetFireStyle_Enemy( EnemyID);
  262.  
  263.       Core_BroadcastEvent( "CrossRoadUnderAttack" );
  264.       Attacked = true;
  265.     }
  266.   }
  267. }
  268. //=====================================================================
  269. class C11_Soviet_Katusha extends CBaseAITask_BaseTask, CNavPointUser
  270.      //CNavPointUser, CBaseAITask_BaseTask
  271. {
  272.   //
  273.   // convoy parameters
  274.  
  275.   vector   DestinationPoint        = GetNavPoint("NavPoint_04");//GetNavPoint("NavPoint_04"); // where to go
  276.   vector   FormationVector         = vector( -20, 0, 0);
  277.   vector   PointOfFire             = vector( 2100, 3485, 130 );
  278.   float    CruiserSpeed            = 25; // autocade with guard should keep this speed
  279.   float    RunSpeed                = 25; // autocade wo guards should keep this speed
  280.   float    OvertakeSpeed           = 28; // maximum allowed speed for overtake
  281.   float    AutocadDistanceMin      = 20; // nearest allowed distance in autocade
  282.   float    AutocadDistanceOptimum  = 25; // try to keep this distance in autocade
  283.   float    AutocadDistanceOvertake = 30; // overtake distance
  284.   float    DisperceRadius          = 60;
  285.   string   CurLeader               = "";
  286.   boolean  IsLeader                = false;
  287.   boolean  OnTanksStops            = false;
  288.  
  289.   //
  290.   // current state
  291.  
  292.   boolean  Moving   = false; // true when object is moving to destination
  293.   boolean  Ambushed = false; // true when object is under ambush
  294.   boolean  Retreat  = false; // true when object is retreating
  295.   boolean  Run      = false; // true when object is running without stop to destination
  296.  
  297.   boolean MovingStatus = false;
  298.   boolean m_MessageOnDisplay = false;
  299.  
  300.   void OnConvoyKatushaStop()
  301.   {
  302.       string Leader = GetCommander("SovietKatusha_Rank");
  303.       OnTanksStops = true;
  304.       if ( Leader != "" )
  305.         {
  306.         SetOrder_Formation(
  307.           Leader,
  308.           FormationVector,
  309.           10, //#TMP
  310.           15, //#TMP
  311.           OvertakeSpeed/2,
  312.           OvertakeSpeed/2);
  313.         }
  314.       if ( !m_MessageOnDisplay )
  315.        {
  316.         m_MessageOnDisplay = true;
  317.         Core_SendEventTo(
  318.             "Helicopter",
  319.             "ShowEventPoint",
  320.             vector( 2890, 5270, 0 ), //        - point to show
  321.             80.0                    //        - distance from camera to point
  322.         );
  323.        }
  324.   }
  325.  
  326.   void ClearState()
  327.   {
  328.     Moving    = false;
  329.     Ambushed  = false;
  330.     Retreat   = false;
  331.     Run       = false;
  332.     CurLeader = "";
  333.     IsLeader  = false;
  334.   }
  335.   void OnKatushaStartFire()
  336.    {
  337. //   PointOfFire = vector( 2100, 3485, 130 );
  338.     if ( OnTanksStops )
  339.      {
  340. //       Core_LogMessage("Katusha has been start of fire "+PointOfFire);
  341.        SetFireStyle_Place( PointOfFire );
  342.        Core_SendEventTo(
  343.             "Helicopter",
  344.             "ShowEventPoint",
  345.             vector( 2890, 5270, 0 ), //        - point to show
  346.             80.0                    //        - distance from camera to point
  347.         );
  348.      }
  349.    }
  350.  
  351.   void Katusha_ChangeFire()
  352.   {
  353.     if ( OnTanksStops )
  354.      {
  355.        PointOfFire = vector( 2350, 3470, 140 );
  356. //       Core_LogMessage("Katusha has been changed point of fire "+PointOfFire);
  357.        SetFireStyle_Place( PointOfFire );
  358.      }
  359.   }
  360.   void Katusha_StopFire()
  361.    {
  362. //    Core_LogMessage("Katusha has been stop fire");
  363.     SetFireStyle_NoFire();
  364.    }
  365.   // start up initialization
  366.   void Init()
  367.   {
  368. //    PointOfFire      = GetNavPoint("NavPoint_05");
  369.     DestinationPoint = GetNavPoint("NavPoint_04");
  370.     SetFireStyle_NoFire();
  371.     // give start order
  372.     GiveOrder_MoveToTarget();
  373.   }
  374.  
  375.   void OnEnemyTargeted()
  376.   {
  377.     if ( !OnTanksStops )
  378.     {
  379.       GiveOrder_Disperse();
  380.     }
  381.   }
  382.  
  383.   void GiveOrder_Disperse()
  384.   {
  385.     // set state
  386.     ClearState();
  387.     Ambushed = true;
  388.  
  389.     SetOrder_StopNow();
  390.  
  391.         // move to random point
  392.         SetOrder_MoveTo(
  393.             GetNowPosition() + vector( rand(DisperceRadius), rand(DisperceRadius), 0.0),
  394.             OvertakeSpeed);
  395.   }
  396.  
  397.   void OnNoEnemy()
  398.   {
  399.     if ( !OnTanksStops )
  400.       {
  401.       GiveOrder_MoveToTarget();
  402.       }
  403.   }
  404.  
  405.   void GiveOrder_MoveToTarget()
  406.   {
  407.     //Core_LogMessage("" + Core_GetIdentificator() + ": order: move to target");
  408.  
  409.     string Leader = GetCommander("SovietKatusha_Rank"); // find leader that we should followed by
  410.     if ( Moving == true
  411.       && Leader == CurLeader)
  412.     {
  413.       // nothing changed
  414.       return;
  415.     }
  416.  
  417.     // set state
  418.     ClearState();
  419.     Moving = true;
  420.     CurLeader = Leader;
  421.  
  422.     if ( Leader == "")
  423.     {
  424.       // we are leader. go directly to destination
  425.       SetOrder_MoveTo(
  426.         DestinationPoint,
  427.         CruiserSpeed);
  428.     }
  429.     else
  430.     {
  431.       // leader found. follow him
  432.       SetOrder_Follow(
  433.         Leader, // follow leader
  434.         AutocadDistanceMin,
  435.         AutocadDistanceOptimum,
  436.         AutocadDistanceOvertake,
  437.         CruiserSpeed,
  438.         OvertakeSpeed);
  439.     };
  440.   }
  441.  
  442.   void OnLeaderLost( string _LeaderID)
  443.   {
  444.     // reorder
  445.     GiveOrder_MoveToTarget();
  446.   }
  447. };
  448.  
  449. //---------------------------------------------------------------------
  450. class C11_NaziReserve extends C11_Soviet_Tank
  451. {
  452.   vector   DestinationPoint = GetNavPoint( "NavPoint_01" ); // where to go
  453.   vector   FormationVector  = vector( -20, 5, 0);
  454.   float    CruiserSpeed     = 29; // autocade with guard should keep this speed
  455.   float    RunSpeed         = 29; // autocade wo guards should keep this speed
  456.   float    OvertakeSpeed    = 30; // maximum allowed speed for overtake
  457.  
  458.   boolean ReserveStop        = false;
  459.   boolean m_MessageOnDisplay = false;
  460.  
  461.   void Init()
  462.     {
  463.     DestinationPoint = GetNavPoint( "NavPoint_01" );
  464. //    GiveOrder_MoveToTarget();
  465.     }
  466.   void OnEnemyTargeted()
  467.     {
  468.       if ( ReserveStop)
  469.       {
  470.         string EnemyID = GetTargetedEnemy();
  471.         SetFireStyle_Enemy( EnemyID);
  472.         GiveOrder_Disperse();
  473.       }
  474.     }
  475.  
  476.   void OnNaziReserveAttack()
  477.     {
  478.       ReserveStop = true;
  479.     }
  480.   void OnNaziReserveStart()
  481.    {
  482.     GiveOrder_MoveToTarget();
  483.     if ( !m_MessageOnDisplay )
  484.      {
  485.         m_MessageOnDisplay = true;
  486.         Core_SendEventTo(
  487.             "Helicopter",
  488.             "ShowEventObject",
  489.             "11_Nazi_Reserve_03",   //        - point to show
  490.             80.0                    //        - distance from camera to point
  491.         );
  492.      }
  493.    }
  494.   void OnStopped()
  495.     {
  496.     if( ReserveStop )
  497.       {
  498.         SetOrder_StopNow();
  499.       }
  500.     }
  501.   // void OnSovietSrikeStop()
  502.   //  {
  503.   //  ReserveStop = true;
  504.   //  }
  505.  
  506.   void GiveOrder_MoveToTarget()
  507.     {
  508.     //Core_LogMessage("" + Core_GetIdentificator() + ": order: move to target");
  509.  
  510.     string Leader = GetCommander("NaziReserve_Rank"); // find leader that we should followed by
  511.     if ( Moving == true
  512.       && Leader == CurLeader)
  513.       {
  514.       // nothing changed
  515.       return;
  516.       }
  517.  
  518.     // set state
  519.     ClearState();
  520.     Moving = true;
  521.     CurLeader = Leader;
  522.  
  523.     if ( Leader == "")
  524.       {
  525.       // we are leader. go directly to destination
  526.       SetOrder_MoveTo(
  527.         DestinationPoint,
  528.         CruiserSpeed);
  529.       }
  530.     else
  531.       {
  532.       // leader found. follow him
  533.       SetOrder_Follow(
  534.         Leader, // follow leader
  535.         AutocadDistanceMin,
  536.         AutocadDistanceOptimum,
  537.         AutocadDistanceOvertake,
  538.         CruiserSpeed,
  539.         OvertakeSpeed);
  540.       }
  541.     }
  542. }
  543. //---------------------------------------------------------------------
  544. class C11_NaziAAReserve extends C11_Soviet_Tank
  545. {
  546.   vector   DestinationPoint = GetNavPoint( "NavPoint_01" ); // where to go
  547.   vector   FormationVector  = vector( -20, 5, 0);
  548.   float    CruiserSpeed     = 30; // autocade with guard should keep this speed
  549.   float    RunSpeed         = 30; // autocade wo guards should keep this speed
  550.   float    OvertakeSpeed    = 32; // maximum allowed speed for overtake
  551.   boolean  ReserveStop      = false;
  552.  
  553.   void Init()
  554.     {
  555.     DestinationPoint = GetNavPoint( "NavPoint_01" );
  556. //    GiveOrder_MoveToTarget();
  557.     }
  558.   void OnNaziReserveStart()
  559.     {
  560.     GiveOrder_MoveToTarget();
  561.     }
  562.   void OnStopped()
  563.     {
  564.     if( ReserveStop )
  565.       {
  566.         SetOrder_StopNow();
  567.       }
  568.     }
  569.   void OnEnemyTargeted()
  570.     {
  571.       if ( ReserveStop)
  572.       {
  573.         string EnemyID = GetTargetedEnemy();
  574.         SetFireStyle_Enemy( EnemyID);
  575.         GiveOrder_Disperse();
  576.       }
  577.     }
  578.   void GiveOrder_MoveToTarget()
  579.     {
  580.     //Core_LogMessage("" + Core_GetIdentificator() + ": order: move to target");
  581.  
  582.     string Leader = GetCommander("NaziAAReserve_Rank"); // find leader that we should followed by
  583.     if ( Moving == true
  584.       && Leader == CurLeader)
  585.       {
  586.       // nothing changed
  587.       return;
  588.       }
  589.  
  590.     // set state
  591.     ClearState();
  592.     Moving = true;
  593.     CurLeader = Leader;
  594.  
  595.     if ( Leader == "")
  596.       {
  597.       // we are leader. go directly to destination
  598.       SetOrder_MoveTo(
  599.         DestinationPoint,
  600.         CruiserSpeed);
  601.       }
  602.     else
  603.       {
  604.       // leader found. follow him
  605.       SetOrder_Follow(
  606.         Leader, // follow leader
  607.         AutocadDistanceMin,
  608.         AutocadDistanceOptimum,
  609.         AutocadDistanceOvertake,
  610.         CruiserSpeed,
  611.         OvertakeSpeed);
  612.       }
  613.     }
  614. }
  615.  
  616. //---------------------------------------------------------------------
  617. class C11_Soviet_Strike extends C11_Soviet_Tank
  618. {
  619.   vector   DestinationPoint        = vector( 2249, 3464, 0 ); // where to go
  620.   vector   FormationVector         = vector( -20, 5, 0);
  621.   float    CruiserSpeed            = 26; // autocade with guard should keep this speed
  622.   float    RunSpeed                = 26; // autocade wo guards should keep this speed
  623.   float    OvertakeSpeed           = 28; // maximum allowed speed for overtake
  624.  
  625.   void Init()
  626.   {
  627.     DestinationPoint = vector( 2249, 3464, 0 );
  628.     GiveOrder_MoveToTarget();
  629.   }
  630.   void OnSovietSrikeStop()
  631.   {
  632.     SetOrder_StopNow();
  633.   }
  634.  
  635.     void GiveOrder_MoveToTarget()
  636.   {
  637.     //Core_LogMessage("" + Core_GetIdentificator() + ": order: move to target");
  638.  
  639.     string Leader = GetCommander("SovietStrike_Rank"); // find leader that we should followed by
  640.     if ( Moving == true
  641.       && Leader == CurLeader)
  642.     {
  643.       // nothing changed
  644.       return;
  645.     }
  646.  
  647.     // set state
  648.     ClearState();
  649.     Moving = true;
  650.     CurLeader = Leader;
  651.  
  652.     if ( Leader == "")
  653.     {
  654.       // we are leader. go directly to destination
  655.       SetOrder_MoveTo(
  656.         DestinationPoint,
  657.         CruiserSpeed);
  658.     }
  659.     else
  660.     {
  661.       // leader found. follow him
  662.       SetOrder_Follow(
  663.         Leader, // follow leader
  664.         AutocadDistanceMin,
  665.         AutocadDistanceOptimum,
  666.         AutocadDistanceOvertake,
  667.         CruiserSpeed,
  668.         OvertakeSpeed);
  669.     }
  670.   }
  671. }
  672. // ---------------------------------------------------------------------
  673. class C11_Soviet_Tank extends CBaseAITask_BaseTask, CNavPointUser
  674.      //CNavPointUser, CBaseAITask_BaseTask
  675. {
  676.   //
  677.   // convoy parameters
  678.  
  679.   vector   DestinationPoint        = vector( 4750, 6700, 0); // where to go
  680.   vector   FormationVector         = vector( -20, 5, 0);
  681.   float    CruiserSpeed            = 27; // autocade with guard should keep this speed
  682.   float    RunSpeed                = 27; // autocade wo guards should keep this speed
  683.   float    OvertakeSpeed           = 30; // maximum allowed speed for overtake
  684.   float    AutocadDistanceMin      = 20; // nearest allowed distance in autocade
  685.   float    AutocadDistanceOptimum  = 25; // try to keep this distance in autocade
  686.   float    AutocadDistanceOvertake = 30; // overtake distance
  687.   float    DisperceRadius          = 50;
  688.   string   CurLeader               = "";
  689.   boolean  IsLeader                = false;
  690.   boolean OnTanksStops             = false;
  691.  
  692.   //
  693.   // current state
  694.  
  695.   boolean  Moving   = false; // true when object is moving to destination
  696.   boolean  Ambushed = false; // true when object is under ambush
  697.   boolean  Retreat  = false; // true when object is retreating
  698.   boolean  Run      = false; // true when object is running without stop to destination
  699.  
  700.   boolean MovingStatus = false;
  701.  
  702.   void OnConvoySTankStop()
  703.   {
  704.       OnTanksStops = true;
  705.       string Leader = GetCommander("SovietTank_Rank");
  706.       if ( Leader != "" )
  707.         {
  708.         SetOrder_Formation(
  709.           Leader,
  710.           FormationVector,
  711.           10, //#TMP
  712.           15, //#TMP
  713.           OvertakeSpeed/2,
  714.           OvertakeSpeed/2);
  715.         }
  716.   }
  717.  
  718.   void ClearState()
  719.   {
  720.     Moving    = false;
  721.     Ambushed  = false;
  722.     Retreat   = false;
  723.     Run       = false;
  724.     CurLeader = "";
  725.     IsLeader  = false;
  726.   }
  727.  
  728.   //
  729.   // start up initialization
  730.  
  731.   void Init()
  732.   {
  733.     DestinationPoint = vector( 4750, 6700, 0);
  734.     // give start order
  735.     GiveOrder_MoveToTarget();
  736.   }
  737.  
  738. //  void OnUpdate()
  739. //  {
  740. //  }
  741.   //
  742.   // orders
  743.  
  744.   void OnEnemyTargeted()
  745.   {
  746.     string EnemyID = GetTargetedEnemy();
  747.     SetFireStyle_Enemy( EnemyID);
  748.     GiveOrder_Disperse();
  749.   }
  750.  
  751.   void GiveOrder_Disperse()
  752.   {
  753.     // set state
  754.     ClearState();
  755.     Ambushed = true;
  756.  
  757.     SetOrder_StopNow();
  758.  
  759.         // move to random point
  760.         SetOrder_MoveTo(
  761.             GetNowPosition() + vector( rand(DisperceRadius), rand(DisperceRadius), 0.0),
  762.             OvertakeSpeed);
  763.   }
  764.  
  765.   void OnNoEnemy()
  766.   {
  767.       GiveOrder_MoveToTarget();
  768.   }
  769.  
  770.   void GiveOrder_MoveToTarget()
  771.   {
  772.     //Core_LogMessage("" + Core_GetIdentificator() + ": order: move to target");
  773.  
  774.     string Leader = GetCommander("SovietTank_Rank"); // find leader that we should followed by
  775.     if ( Moving == true
  776.       && Leader == CurLeader)
  777.     {
  778.       // nothing changed
  779.       return;
  780.     }
  781.  
  782.     // set state
  783.     ClearState();
  784.     Moving = true;
  785.     CurLeader = Leader;
  786.  
  787.     if ( Leader == "")
  788.     {
  789.       // we are leader. go directly to destination
  790.       SetOrder_MoveTo(
  791.         DestinationPoint,
  792.         CruiserSpeed);
  793.     }
  794.     else
  795.     {
  796.       // leader found. follow him
  797.       SetOrder_Follow(
  798.         Leader, // follow leader
  799.         AutocadDistanceMin,
  800.         AutocadDistanceOptimum,
  801.         AutocadDistanceOvertake,
  802.         CruiserSpeed,
  803.         OvertakeSpeed);
  804.     }
  805.   }
  806.  
  807.   void OnLeaderLost( string _LeaderID)
  808.   {
  809.     // reorder
  810.     GiveOrder_MoveToTarget();
  811.   }
  812. }
  813. // -----------------------------------------------------------------------------
  814. class C11_Platoon extends CBaseAITask_BaseTask, CNavPointUser
  815. {
  816.   //
  817.   // convoy parameters
  818.  
  819.   vector   DestinationPoint        = vector( 4015, 6760, 0); // where to go
  820.   vector   FormationVector         = vector( 5, -90, 0);
  821.   float    CruiserSpeed            = 20; // autocade with guard should keep this speed
  822.   float    RunSpeed                = 20; // autocade wo guards should keep this speed
  823.   float    OvertakeSpeed           = 25; // maximum allowed speed for overtake
  824.   float    AutocadDistanceMin      = 20; // nearest allowed distance in autocade
  825.   float    AutocadDistanceOptimum  = 25; // try to keep this distance in autocade
  826.   float    AutocadDistanceOvertake = 30; // overtake distance
  827.   float    DisperceRadius          = 50;
  828.   string   CurLeader               = "";
  829.   boolean  IsLeader                = false;
  830.   boolean OnTanksStops             = false;
  831.  
  832.   //
  833.   // current state
  834.  
  835.   boolean  Moving   = false; // true when object is moving to destination
  836.   boolean  Ambushed = false; // true when object is under ambush
  837.   boolean  Retreat  = false; // true when object is retreating
  838.   boolean  Run      = false; // true when object is running without stop to destination
  839.  
  840.   boolean MovingStatus = false;
  841.  
  842.   void OnConvoySPlatoonStop()
  843.   {
  844.     if ( !OnTanksStops )
  845.       {
  846.         OnTanksStops = true;
  847.         SetOrder_Formation(
  848.           Leader,
  849.           FormationVector,
  850.           45, //#TMP
  851.           15, //#TMP
  852.           OvertakeSpeed/2,
  853.           OvertakeSpeed/2);
  854.       }
  855.   }
  856.  
  857.   void ClearState()
  858.   {
  859.     Moving    = false;
  860.     Ambushed  = false;
  861.     Retreat   = false;
  862.     Run       = false;
  863.     CurLeader = "";
  864.     IsLeader  = false;
  865.   }
  866.  
  867.   //
  868.   // start up initialization
  869.  
  870.   void Init()
  871.   {
  872.     SetFireStyle_Nearest();
  873.     DestinationPoint = vector( 4015, 6760, 0);
  874.     // give start order
  875.   }
  876.  
  877.   void CrossRoadUnderAttack()
  878.     {
  879.       GiveOrder_MoveToTarget();
  880.     }
  881.  
  882. //  void OnUpdate()
  883. //  {
  884. //  }
  885.   //
  886.   // orders
  887.  
  888.   void OnEnemyTargeted()
  889.   {
  890.     string EnemyID = GetTargetedEnemy();
  891.     SetFireStyle_Enemy( EnemyID);
  892.     GiveOrder_Disperse();
  893.   }
  894.  
  895.   void GiveOrder_Disperse()
  896.   {
  897.     // set state
  898.     ClearState();
  899.     Ambushed = true;
  900.  
  901.     SetOrder_StopNow();
  902.  
  903.         // move to random point
  904.         SetOrder_MoveTo(
  905.             GetNowPosition() + vector( rand(DisperceRadius), rand(DisperceRadius), 0.0),
  906.             OvertakeSpeed);
  907.   }
  908.  
  909.   void OnNoEnemy()
  910.   {
  911.       GiveOrder_MoveToTarget();
  912.   }
  913.  
  914.   void GiveOrder_MoveToTarget()
  915.   {
  916.     //Core_LogMessage("" + Core_GetIdentificator() + ": order: move to target");
  917.  
  918.     string Leader = GetCommander("Platoon_Rank"); // find leader that we should followed by
  919.     if ( Moving == true
  920.       && Leader == CurLeader)
  921.     {
  922.       // nothing changed
  923.       return;
  924.     }
  925.  
  926.     // set state
  927.     ClearState();
  928.     Moving = true;
  929.     CurLeader = Leader;
  930.  
  931.     if ( Leader == "")
  932.     {
  933.       // we are leader. go directly to destination
  934.       SetOrder_MoveTo(
  935.         DestinationPoint,
  936.         CruiserSpeed);
  937.     }
  938.     else
  939.     {
  940.       // leader found. follow him
  941.       SetOrder_Follow(
  942.         Leader, // follow leader
  943.         AutocadDistanceMin,
  944.         AutocadDistanceOptimum,
  945.         AutocadDistanceOvertake,
  946.         CruiserSpeed,
  947.         OvertakeSpeed);
  948.     };
  949.   }
  950.  
  951.   void OnLeaderLost( string _LeaderID)
  952.   {
  953.     // reorder
  954.     GiveOrder_MoveToTarget();
  955.   }
  956. };
  957.  
  958.  
  959.